function Punto(x,y) {
	this.x = x;
	this.y = y;
}

function Segmento(x1,y1,x2,y2) {
	this.x1 = x1;
	this.y1 = y1;
	this.x2 = x2;
	this.y2 = y2;
	if (this.y1 == this.y2)
		this.tipo = HORIZONTAL;
	else {
		// x1 == x2
		if (this.y1 > this.y2)
			this.tipo = VERTICAL_DER;
		else
			this.tipo = VERTICAL_IZQ;
	}
	
	this.contiene = function(x,y) {
		switch (this.tipo) {
			case HORIZONTAL:
					return (y == this.y1 && x >= this.x1 && x <= this.x2);
				break;
			case VERTICAL_DER:
					return (x == this.x1 && y >= this.y2 && y <= this.y1);
				break;
			case VERTICAL_IZQ:
					return (x == this.x1 && y >= this.y1 && y <= this.y2);
				break;
		}
	} 
	
	this.moverA = function(x, y) {
		var res = MOVER_NOK;
		if (this.contiene(x, y)) return MOVER_OK;
		switch (this.tipo) {
			case HORIZONTAL:
					if (y == this.y1) {
						if (x < x1)
							res = x1;
						else
							res = x2;
					} 
				break;
			case VERTICAL_DER:
					if (x == this.x1) {
						if (y > y1)
							res = y1;
						else 
							res = y2;
					}
				break;
			case VERTICAL_IZQ:
					if (x == x1) {
						if (y < y1)
							res = y1;
						else 
							res = y2;
					}
				break;
		}
		return res;
	}
}

function crearSegmentos(puntos) {
	var segmentos = new Array();
	var indice = 0;
	for (var i=0; i<puntos.length-2; i=i+2) {
		segmentos[indice] = new Segmento(puntos[i], puntos[i+1], puntos[i+2], puntos[i+3]);
		indice++;
	}
	console.log("num segmentos: " + indice);
	return segmentos;
}

function cargarImagenesPantalla(numero, tieneFrente) {
	// TODO A medida que hagamos las pantallas verificaremos si esto funciona o no. Se carga la imagen y al cambiar el background el
	// navegador no vuelve a ir a por ella al servidor (con un sniffer podriamos ver las peticiones)
	canvasFrente.style.visibility = "visible";
	canvasFrente.style.backgroundImage = "url(imagenes/cargando.png)";
	var fondoCargado = false;
	var frenteCargado = false;
	var imgFrente = new Image();	
	var imgFondo = new Image();
	imgFrente.onload = function() {
		frenteCargado = true;
		if (fondoCargado) {
			if (tieneFrente)
				canvasFrente.style.backgroundImage = "url('imagenes/pantalla_" + numero + "/frente.png')";
			else
				canvasFrente.style.visibility = "hidden";
		}
	}
	imgFondo.onload = function() {
		fondoCargado = true;
		canvasFondo.style.backgroundImage = "url('imagenes/pantalla_" + numero + "/fondo.png')";
		if (frenteCargado || !tieneFrente) {
			if (tieneFrente)
				canvasFrente.style.backgroundImage = "url('imagenes/pantalla_" + numero + "/frente.png')";
			else
				canvasFrente.style.visibility = "hidden";
		}
	}	
	imgFondo.src = "imagenes/pantalla_" + numero + "/fondo.png";
	if (tieneFrente)
		imgFrente.src = "imagenes/pantalla_" + numero + "/frente.png";
}

function Pantalla(numero, puntos, tieneFrente, puntoInicial, puntoFinal, escalaReducida) {
	// El número de la pantalla para cargar las imagenes
	// los puntos para ver los segmentos y el recorrido
	// Si tiene imagen para el canvas del frente o no
	// Punto inicial - para mostrar el personaje cuando se accede a la pantalla por la izquierda
	// Punto final - para mostrar el personaje cuando se accede a la pantalla por la derecha
	this.numero = numero;
	this.puntos = puntos;
	cargarImagenesPantalla(numero, tieneFrente);
	this.puntoInicial = puntoInicial;
	this.puntoFinal = puntoFinal;
	this.segmentos = crearSegmentos(puntos);
	this.escalaReducida = escalaReducida;
		
	this.moverA = function(x1, y1, x2, y2) {
		for (var i=0; i<this.segmentos.length;i++) {
			if (this.segmentos[i].contiene(x2, y2))
				return this.segmentos[i].moverA(x2, y2);
		}
		for (var i=0; i<this.segmentos.length; i++) {
			if (this.segmentos[i].contiene(x1, y1))
				return this.segmentos[i].moverA(x2, y2);
		}
		return MOVER_NOK;
	}
	
	this.getPosicionInicial = function() {
		if (this.puntoInicial == null)
			this.puntoInicial = new Punto(this.puntos[0], this.puntos[1]);
		return this.puntoInicial;
	}
	
	this.getPosicionFinal = function() {
		if (this.puntoFinal == null)
			this.puntoFinal = new Punto(this.puntos[this.puntos.length-2], this.puntos[this.puntos.length-1]);
		return this.puntoFinal;
	}
	
	this.getTipoSegmento = function(x, y) {
		for (var i=0; i<this.segmentos.length; i++) {
			if (this.segmentos[i].contiene(x, y))
				return this.segmentos[i].tipo;
		}
		return null;
	}
	
	this.hayQueCambiarDePantalla = function(x, y) {
		if (x == this.puntos[0] && y == this.puntos[1])
			return this.numero-1;
		if (this.numero != MAX_PANTALLAS && x == this.puntos[this.puntos.length-2] && y == this.puntos[this.puntos.length-1])
			return this.numero+1;
		return 0;	 
	}
	
	this.getMinY = function(x1, x2) {
		var min = MAX_ALTO;
		var segmento;
		for (var i=0; i<this.segmentos.length; i++) {
			segmento = this.segmentos[i];
			if (segmento.tipo == HORIZONTAL) {
				if (segmento.x1<x1 && segmento.x2>x2)
					min = Math.min(min, segmento.y1);
				if (segmento.x1<x2 && segmento.x2>x2)
					min = Math.min(min, segmento.y1);
			}
		}
		min = min + principal.sprite.rectIzq.alto;
		console.log("Min: " + min);
		return min;
	}

}

function getPantalla(numero) {
	enemigos = new Array();
	switch (numero) {
		case 1:  
				return new Pantalla(1, [2,260,752,260], true, new Punto(100, 260), new Punto(730, 260), false);
				// return new Pantalla(1, [66,324,798,324], true, new Punto(66, 324 - 121), new Punto(796, 324 - 121), false);
			break;
		case 2:
				enemigos[0] = new Sprite("imagenes/pajaro.png", new RectanguloSprite(0,0,94,66,3), new RectanguloSprite(4,68,43,31,1), new RectanguloSprite(54,66,64,64,2));
				return new Pantalla(2, [0,255,180,255,180,54,546,54,546,255,736,255], false, null, null, false);
				// return new Pantalla(2, [0,376,244,376,244,118,610,118,610,376,798,376], false, null, null, false);
			break;				
		case 3:
				return new Pantalla(3, [2,314,58,314,58,185,238,185,238,77,416,77,416,1,624,1,624,144,752,144], true, null, null, true);
			break;
	}
	return null;
}
